package src.main.java.com.ui;

import javax.swing.*;
// import javax.swing.JMenu;
// import javax.swing.JMenuBar;
// import javax.swing.JMenuItem;
// import javax.swing.ImageIcon;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {

  // 创建一个二位数组 会根据二维数组中的数据进行加载
  int[][] data = new int[3][3];

  // 默认空白区域坐标
  int x = 0;
  int y = 0;

  // 图片路径
  // 获取图片路径 (绝对路径/相对路径)
  String path = "E:\\Java\\Demo\\images\\lufei\\";

  // 胜利的二维数组信息
  int[][] win = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 0 } };

  // 计步器
  int step = 0;

  // 创建菜单成员变量
  JMenuItem restart = new JMenuItem("重新开始");
  JMenuItem reLoginin = new JMenuItem("重新登录");
  JMenuItem exit = new JMenuItem("退出游戏");
  JMenuItem accountItem = new JMenuItem("公众号");

  // 创建一个游戏界面
  public GameJFrame() {
    this.initFrame();
    this.initData();
    this.initMenu();
    this.initImage();
    this.setVisible(true);
    this.addKeyListener(this);
  }

  // 初始化数据
  private void initData() {
    int[] arr = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
    // 打乱数组
    for (int i = 0; i < arr.length; i++) {
      int index = (int) (Math.random() * arr.length);
      int temp = arr[i];
      arr[i] = arr[index];
      arr[index] = temp;
    }

    // 给二维数组添加数据
    // 方法一
    // int index = 0;
    // for (int i = 0; i < data.length; i++) {
    // for (int j = 0; j < data[i].length; j++) {
    // data[i][j] = (int) arr[index];
    // index++;
    // }
    // }
    // 方法二
    for (int i = 0; i < arr.length; i++) {
      if (arr[i] == 0) {
        x = i / 3;
        y = i % 3;
      }
      data[i / 3][i % 3] = arr[i];
    }
  }

  // 初始化图片
  // 添加图片的时候，就需要按照二维数组中管理的数据添加图片
  private void initImage() {
    // 清除界面
    this.getContentPane().removeAll();

    // 判断是否胜利
    if (victory()) {
      JLabel win = new JLabel(new ImageIcon("E:\\Java\\Demo\\images\\common\\winner.png"));
      win.setBounds(316, 390, 268, 120);
      this.getContentPane().add(win);
    }

    JLabel stepCount = new JLabel("步数：" + step);
    stepCount.setBounds(25, 0, 100, 50);
    this.getContentPane().add(stepCount);

    // 创建图片
    // ImageIcon icon = new ImageIcon(path + "1.jpg");
    // 创建一个label对象(管理容器)
    // JLabel jLabel = new JLabel(new ImageIcon(path + "1.jpg"));
    // jLabel.setBounds(0, 0, 100, 100);
    // 把管理容器添加到页面
    // this.add(jLabel);

    // this.getContentPane().add(jLabel);\

    // 循环添加图片
    int size = 300; // 图片大小
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        // 获取当前要加载图片的序号
        int number = data[i][j];
        JLabel jLabel = new JLabel(new ImageIcon(path + number + ".jpg"));
        jLabel.setBounds(size * j, size * i + 50, size, size);
        this.getContentPane().add(jLabel);
      }
    }

    // 重新绘制
    this.getContentPane().repaint();
  }

  // 初始化窗口
  public void initFrame() {
    this.setTitle("游戏界面");
    this.setSize(900, 1000);
    this.setAlwaysOnTop(true);
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLayout(null);
  }

  // 初始化菜单
  public void initMenu() {
    JMenuBar jMenuBar = new JMenuBar();
    JMenu actions = new JMenu("功能");
    JMenu abouts = new JMenu("关于我们");
    // 更多操作参考153集
    // JMenu more = new JMenu("更多");

    actions.add(exit);
    actions.add(restart);
    actions.add(reLoginin);

    restart.addActionListener(this);
    reLoginin.addActionListener(this);
    exit.addActionListener(this);
    accountItem.addActionListener(this);

    jMenuBar.add(actions);

    abouts.add(accountItem);
    jMenuBar.add(abouts);

    this.setJMenuBar(jMenuBar);
  }

  @Override
  public void keyTyped(KeyEvent e) {

  }

  @Override
  public void keyPressed(KeyEvent e) {
    // 给A长按的时候添加一个查看完整图片
    int keyCode = e.getKeyCode();
    // System.out.println(keyCode);
    if (keyCode == 65) {
      this.getContentPane().removeAll();
      JLabel jLabel = new JLabel(new ImageIcon(path + "\\all.jpg"));
      jLabel.setBounds(0, 0, 900, 900);
      this.getContentPane().add(jLabel);
      this.getContentPane().repaint();
    }
  }

  @Override
  public void keyReleased(KeyEvent e) {
    if (victory()) {
      return;
    }

    // 对上，下，左，右进行判断
    // 左:37上:38右:39下:40
    int keyCode = e.getKeyCode();
    // System.out.println(keyCode);

    if (keyCode == 37) {
      // 空白区域向左移动 内容区域向右移动
      // System.out.println('左');

      // 判断是否越界
      if (y == 2) {
        return;
      }

      data[x][y] = data[x][y + 1];
      data[x][y + 1] = 0;
      y++;
      step++;

      // 重载图片
      initImage();
    } else if (keyCode == 38) {
      // 空白区域向上移动 内容区域向下移动
      // System.out.println('上');

      // 判断是否越界
      if (x == 2) {
        return;
      }

      data[x][y] = data[x + 1][y];
      data[x + 1][y] = 0;
      x++;
      step++;

      // 重载图片
      initImage();
    } else if (keyCode == 39) {
      // 空白区域向右移动 内容区域向左移动
      // System.out.println('右');

      // 判断是否越界
      if (y == 0) {
        return;
      }

      data[x][y] = data[x][y - 1];
      data[x][y - 1] = 0;
      y--;
      step++;

      // 重载图片
      initImage();
    } else if (keyCode == 40) {
      // 空白区域向下移动 内容区域向上移动
      // System.out.println('下');

      // 判断是否越界
      if (x == 0) {
        return;
      }

      data[x][y] = data[x - 1][y];
      data[x - 1][y] = 0;
      x--;
      step++;
      // 重载图片
      initImage();
    } else if (keyCode == 65) {
      initImage();
    } else if (keyCode == 87) {
      data = new int[][] {
          { 1, 2, 3 },
          { 4, 5, 6 },
          { 7, 8, 0 }
      };

      initImage();
    }
  }

  // 判断数据数组中的数据是否跟win数组中相同
  // 如果全部相同，返回true。否则返回false
  public boolean victory() {
    for (int i = 0; i < data.length; i++) {
      for (int j = 0; j < data[i].length; j++) {
        if (data[i][j] != win[i][j]) {
          return false;
        }
      }
    }

    return true;
  }

  @Override
  public void actionPerformed(ActionEvent e) {
    Object obj = e.getSource();

    if (obj == restart) {
      // System.out.println("重新开始游戏");
      // 清除计步器信息
      step = 0;
      // 1、打乱二维数组中的数据
      initData();
      // 重新加载图片
      initImage();
    } else if (obj == reLoginin) {
      // System.out.println("重新登录");
      // 关闭当前页面
      this.setVisible(false);

      // 打开登录页面
      new LoginJFrame();
    } else if (obj == exit) {
      // System.out.println("退出游戏");
      System.exit(0);
    } else if (obj == accountItem) {
      // System.out.println("公众号");

      // 创建一个弹窗对象
      JDialog jDialog = new JDialog();

      // 创建一个标签对象
      JLabel jLabel = new JLabel(new ImageIcon("E:\\Java\\Demo\\images\\common\\winner.png"));
      jLabel.setBounds(0, 0, 200, 200);

      // 把标签对象添加到弹窗对象中
      jDialog.getContentPane().add(jLabel);

      // 给弹窗设置大小
      jDialog.setSize(200, 200);

      // 设置弹窗置顶
      jDialog.setAlwaysOnTop(true);

      // 让弹窗居中
      jDialog.setLocationRelativeTo(null);

      // 弹框不关闭则无法操作下面的界面
      jDialog.setModal(true);

      jDialog.setVisible(true);
    }
  }
}